package main

import (
	"context"  // 导入上下文包，用于控制请求的超时和取消
	"fmt"      // 导入格式化包，用于输出信息
	"net/http" // 导入HTTP包，用于定义HTTP状态码和响应

	"github.com/gin-gonic/gin"     // 导入Gin框架，用于快速构建Web应用
	"github.com/go-redis/redis/v8" // 导入Redis客户端库，支持Go模块
)

var ctx = context.Background() // 创建一个背景上下文，用于Redis操作

func main() {
	// 初始化Redis客户端，连接到指定的Redis服务器
	rdb := redis.NewClient(&redis.Options{
		Addr:     "192.168.1.4:6379", // Redis服务器地址
		Password: "",                 // Redis没有设置密码
		DB:       0,                  // 使用默认的数据库（编号0）
	})

	// 测试Redis连接是否成功
	pong, err := rdb.Ping(ctx).Result() // 发送Ping命令，检测连接
	if err != nil {
		panic(err) // 连接失败则抛出异常
	}
	fmt.Println("Redis ping response:", pong) // 输出Ping的响应

	// 创建一个默认的Gin路由引擎
	r := gin.Default()

	// 定义一个POST接口，用于设置Redis中的键值对
	r.POST("/set", func(c *gin.Context) {
		key := c.Query("key")     // 获取请求中的key参数
		value := c.Query("value") // 获取请求中的value参数
		if key == "" || value == "" {
			// 如果key或value为空，返回400错误
			c.JSON(http.StatusBadRequest, gin.H{"error": "key and value are required"})
			return
		}
		// 在Redis中设置key对应的值，过期时间为0表示永不过期
		err := rdb.Set(ctx, key, value, 0).Err()
		if err != nil {
			// 设置失败，返回500错误
			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
			return
		}
		// 设置成功，返回成功状态
		c.JSON(http.StatusOK, gin.H{"status": "success"})
	})

	// 定义一个GET接口，用于获取Redis中的值
	r.GET("/get", func(c *gin.Context) {
		key := c.Query("key") // 获取请求中的key参数
		if key == "" {
			// 如果key为空，返回400错误
			c.JSON(http.StatusBadRequest, gin.H{"error": "key is required"})
			return
		}
		// 从Redis中获取对应的值
		val, err := rdb.Get(ctx, key).Result()
		if err == redis.Nil {
			// 如果key不存在，返回404错误
			c.JSON(http.StatusNotFound, gin.H{"error": "key does not exist"})
			return
		} else if err != nil {
			// 其他错误，返回500错误
			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
			return
		}
		// 返回获取到的值
		c.JSON(http.StatusOK, gin.H{"key": key, "value": val})
	})

	// 启动HTTP服务器，监听端口8080
	r.Run(":8080")
}
